package date_202405

//3. 无重复字符的最长子串
//已解答
//中等
//相关标签
//相关企业
//给定一个字符串 s ，请你找出其中不含有重复字符的 最长
//子串
//的长度。
//
//
//
//示例 1:
//
//输入: s = "abcabcbb"
//输出: 3
//解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。
//示例 2:
//
//输入: s = "bbbbb"
//输出: 1
//解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。
//示例 3:
//
//输入: s = "pwwkew"
//输出: 3
//解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
//请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
//
//
//提示：
//
//0 <= s.length <= 5 * 104
//s 由英文字母、数字、符号和空格组成

func lengthOfLongestSubstring(s string) int {
	if len(s) <= 1 {
		return len(s)
	}

	longest := 0
	left, right := 0, 0
	windows := make(map[byte]struct{}, 128)
	for right < len(s) {
		_, contains := windows[s[right]]
		for contains {
			delete(windows, s[left])
			left++
			_, contains = windows[s[right]]
		}
		windows[s[right]] = struct{}{}
		longest = IntMax04(longest, right-left+1)
		right++
	}
	return longest
}

func IntMax04(a, b int) int {
	if a > b {
		return a
	}
	return b
}
